﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Web;
using System.Web.SessionState;

namespace StudentManagerPro.Code
{
    /// <summary>
    /// Code2 的摘要说明
    /// </summary>
    public class Code2 : IHttpHandler,IRequiresSessionState
    {

        //请求处理
        public void ProcessRequest(HttpContext context)
        {
            //将验证码保存到Session中
            context.Session["CheckCode"] = CreateCode();
            //创建并输出带验证码的图片
            CreateImages(context.Session["CheckCode"].ToString(), context);
        }
        //生成四位数字验证码
        private string CreateCode()
        {
            Random rand = new Random();
            int vCode = 0;
            while (true)
            {
                vCode = rand.Next(9999);//生成小于9999的一个整数（4位数、3位数、2位数）
                if (vCode.ToString().Length == 4) break;
            }
            return vCode.ToString();
        }
        //创建带验证码的图片
        private void CreateImages(string checkCode, HttpContext context)
        {
            //【1】创建一个指定大小的空白图片
            System.Drawing.Bitmap image = new System.Drawing.Bitmap(55, 23); //创建一个空白图片
            Graphics grap = Graphics.FromImage(image); //创建GDI+绘图的核心对象（该对象提供各种绘图的方法和属性）
            grap.Clear(Color.White); //将整个绘图面变成白色

            //【2】定义字体和笔刷，并将验证码绘制在空白图片上面
            Font f = new System.Drawing.Font("宋体", 14, System.Drawing.FontStyle.Bold);
            Brush b = new System.Drawing.SolidBrush(Color.DarkBlue);
            grap.DrawString(checkCode, f, b, new Point(3, 3));  //使用笔刷安照指定的字体将验证码绘制在空白图片上面

            //【3】给图片画一个边框
            Pen p = new Pen(Color.Black, 0);//定义一个用于绘制直线和曲线的对象。第一个参数指定的颜色。第二个参数Width 属性设置为在 width 参数中指定的值。width 为 0 将导致 Pen 的绘图效果呈现为宽度为 1 的形式。
            grap.DrawRectangle(p, 0, 0, image.Width - 1, image.Height - 1);//前两个参数0,0表示绘制开始的坐标，后面的参数表示大小

            //【4】使用内存流输出到浏览器
            System.IO.MemoryStream ms = new System.IO.MemoryStream();
            image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);//以gif格式保存图片到输出流
            context.Response.ClearContent();//清除缓冲区中的内容
            context.Response.ContentType = "image/gif";//指定输出的类型
            context.Response.BinaryWrite(ms.ToArray());//以二进制字符串的方式将图片内容到HTTP输出流

            //【5】资源释放
            grap.Dispose();  //释放绘图对象
            image.Dispose();//释放图片对象
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}